﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;

namespace Kinematic
{
    public class Characters : Kinematic
    {
        protected Fisica MotorFisico;
        protected Class1 MotorMovimiento;
        protected List<Behavior> Behaviors;
        protected string EstadoActual;
        private Dictionary<string, float> Estados;
        public Dictionary<string, Kinematic> Targets;


        public Characters(Vector3 Position, float Orientation)
            : base(Position, Orientation)
        {
            Estados = new Dictionary<string, float>();
            Targets = new Dictionary<string, Kinematic>();
            MotorMovimiento = new Class1();
            Behaviors = new List<Behavior>();
            MotorFisico = new Fisica();

            Estados.Add("KWander", 15);
            Estados.Add("KSeek", 15);
            Estados.Add("DSeek", 15);
            Estados.Add("KArrive", 15);
            Estados.Add("DArrive", 15);
            Estados.Add("Pursue", 15);
            Estados.Add("KFlee", 15);
            Estados.Add("DFlee", 15);
            Estados.Add("KLeave", 15);
            Estados.Add("DLeave", 15);
            Estados.Add("Evade", 15);
        }

        public void Update(float Time, bool LWTG = true)
        {
            if (LWTG)
            {
                MotorMovimiento.SetLWTG();
                Behaviors.Add(new Behavior(MotorMovimiento.LookWhereYoureGoing(this, this), 20.0f, "LWTG"));
            }
            MotorMovimiento.SetBS();
            SteeringOutput Steering = MotorMovimiento.BlendedSteering(Behaviors);
            Behaviors.Clear();
            base.Update(Steering, Time);
        }

        protected void AgregarCaso()
        {
            switch (EstadoActual)
            {
                case "KWander":
                    MotorMovimiento.SetKW();
                    Behaviors.Add(new Behavior(MotorMovimiento.KinematicWander(this), Estados[EstadoActual], "KWander"));
                    break;
                case "KSeek":
                    MotorMovimiento.SetKS();
                    Behaviors.Add(new Behavior(MotorMovimiento.KinematicSeek(this, Targets["KSeek"]), Estados[EstadoActual], "KSeek"));
                    break;
                case "DSeek":
                    MotorMovimiento.SetDS();
                    Behaviors.Add(new Behavior(MotorMovimiento.DynamicSeek(this, Targets["DSeek"]), Estados[EstadoActual], "DSeek"));
                    break;
                case "KArrive":
                    MotorMovimiento.SetKA();
                    Behaviors.Add(new Behavior(MotorMovimiento.KinematicArrive(this, Targets["KArrive"]), Estados[EstadoActual], "KArrive"));
                    break;
                case "DArrive":
                    MotorMovimiento.SetDA();
                    Behaviors.Add(new Behavior(MotorMovimiento.DynamicArrive(this, Targets["DArrive"]), Estados[EstadoActual], "DArrive"));
                    break;
                case "Pursue":
                    MotorMovimiento.SetP();
                    Behaviors.Add(new Behavior(MotorMovimiento.Pursue(this, Targets["Pursue"]), Estados[EstadoActual], "Pursue"));
                    break;
                case "KFlee":
                    MotorMovimiento.SetKF();
                    Behaviors.Add(new Behavior(MotorMovimiento.KinematicFlee(this, Targets["KFlee"]), Estados[EstadoActual], "KFlee"));
                    break;
                case "DFlee":
                    MotorMovimiento.SetDF();
                    Behaviors.Add(new Behavior(MotorMovimiento.DynamicFlee(this, Targets["DFlee"]), Estados[EstadoActual], "DFlee"));
                    break;
                case "KLeave":
                    MotorMovimiento.SetKL();
                    Behaviors.Add(new Behavior(MotorMovimiento.KinematicLeave(this, Targets["KLeave"]), Estados[EstadoActual], "KLeave"));
                    break;
                case "DLeave":
                    MotorMovimiento.SetDL();
                    Behaviors.Add(new Behavior(MotorMovimiento.DynamicLeave(this, Targets["DLeave"]), Estados[EstadoActual], "DLeave"));
                    break;
                case "Evade":
                    MotorMovimiento.SetE();
                    Behaviors.Add(new Behavior(MotorMovimiento.Evade(this, Targets["Evade"]), Estados[EstadoActual], "Evade"));
                    break;
            }


        }

    }

}
